#include "key.h"
#include "stm32l1xx_hal.h"

#define KEY0 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9)//读取按键

//为了代码不那么乱，这里我定义了一个结构体，不想使用结构体的可以直接定义全局变量
typedef struct {
    uint32_t u32time1;            //第一次按下后开始计时，主要用于判断长按，放在定时器中自加
    uint32_t u32time2;            //第一次松手后开始计时，用于判断双击或单击，放在定时器中自加
    uint8_t u8key_flag;           //第一次按下标志
    uint8_t u8key_double_flag;    //第二次标志
}Key_Tag;
 
Key_Tag skey;
 
#define KEY_DOWN 1
#define KEY_UP 0

static uint32_t prev_ticks = 0;
//uint32_t dt_single = 0;
 
uint8_t KEY_Scan()
{
    static uint8_t press = 0;
    uint32_t now_ticks = HAL_GetTick();
    skey.u32time1 += now_ticks - prev_ticks;
    skey.u32time2 += now_ticks - prev_ticks;
    prev_ticks = now_ticks;
        
    if(KEY0 == KEY_DOWN)//按键按下
    {
        //dt_single = HAL_GetTick();
        HAL_Delay(10);//消抖
        if(KEY0 == KEY_DOWN)
        { 
            if(skey.u8key_flag == 0)
            {
                skey.u8key_flag = 1;        //第一次按下，标志位置1。同时计数值归零
                skey.u32time1 = 0;
            }
            else if(skey.u8key_flag == 1)
            {
                if(!press && skey.u32time1 > 2000)//如果第一次按下且时间超过3S，视为长按
                {
                    press = 1;
                    return LONG_PRES;//返回长按键值
                }
            }
        }
    }
    
    else if(KEY0 == KEY_UP)//按键松开
    {
        if(skey.u8key_flag == 1)    //第一次按键松开
        {
            skey.u8key_flag = 0;
            if(skey.u32time1 > 2000)//按下后超过3秒才松开，已经返回了键值，松手后把标志位都归零
            {
                press = 0;
                skey.u32time1 = 0;
                skey.u32time2 = 0;
                skey.u8key_flag = 0;
                skey.u8key_double_flag = 0;
            }
            else if(skey.u8key_double_flag == 0)
            {
                skey.u8key_double_flag = 1;    //第一次松开之后标志位置1开始等待第二次按键松开
                skey.u32time2 = 0;            
            }
            else if(skey.u8key_double_flag == 1)
            {
                if(skey.u32time2 < 300)            //如果第二次松开时间间隔小于0.5S，视为双击
                {
                    skey.u8key_double_flag = 0;
 
                    return DOUBLE_PRES;
                }
            }
        }
        else if(skey.u8key_double_flag == 1)
        {
            if(skey.u32time2 >= 300)            
            {
                skey.u8key_double_flag = 0;
 
                return KEY0_PRES;//如果第一次松开之后0.5s没有第二次按键操作，视为短按
            }
        }
    }
    return 0;//没有按键按下返回0
}
